package main

import (
	"fmt"
	"log"
	"net"
	"net/http"
	"os"
	"strings"
)

/*
接收客户端 request，并将 request 中带的 header 写入 response header
读取当前系统的环境变量中的 VERSION 配置，并写入 response header
Server 端记录访问日志包括客户端 IP，HTTP 返回码，输出到 server 端的标准输出
当访问 localhost/healthz 时，应返回 200
*/
func main() {
	mux := http.NewServeMux()
	mux.HandleFunc("/", index)
	mux.HandleFunc("/healthz", healthz)
	if err := http.ListenAndServe(":8080", mux); err != nil {
		log.Fatalf("starting httpserver failed, error: %s", err.Error())
	}

}

/*
*
index页面
*/
func index(w http.ResponseWriter, r *http.Request) {

	//1.接收客户端 request，并将 request 中带的 header 写入 response header
	for k, v := range r.Header {
		for _, vv := range v {
			log.Printf("header key: %s, header value: %s", k, vv)
			w.Header().Add(k, vv)
		}
	}

	//2.读取当前系统的环境变量中的 VERSION 配置，并写入 response header
	os.Setenv("VERSION", "homework01")
	version := os.Getenv("VERSION")
	log.Printf("env VERSION:%s", version)
	w.Header().Add("VERSION", version)

	//3.Server 端记录访问日志包括客户端 IP，HTTP 返回码，输出到 server 端的标准输出
	clientIp := getClientIp(r)
	log.Printf("client ip:%s", clientIp)
	log.Printf("code:%d", http.StatusOK)

}

/*
*
获取客户端IP
*/
func getClientIp(r *http.Request) string {
	xForwardedFor := r.Header.Get("X-Forwarded-For")
	ip := strings.TrimSpace(strings.Split(xForwardedFor, ",")[0])
	if ip != "" {
		return ip
	}
	ip = strings.TrimSpace(r.Header.Get("X-Real-Ip"))
	if ip != "" {
		return ip
	}
	if ip, _, err := net.SplitHostPort(strings.TrimSpace(r.RemoteAddr)); err == nil {
		return ip
	}
	return ""
}

/*
healthz页面
*/
func healthz(w http.ResponseWriter, r *http.Request) {
	//4.当访问 localhost/healthz 时，应返回 200
	fmt.Fprintf(w, "200")
}
